\subsection{Diagrama de Clases Conceptuales}

\begin{figure}[!ht]
	\begin{center}
		\includegraphics[angle=90 ,scale=0.48]{imagenes/diagramas/DiagramaConceptual.png}
	\end{center}
		\caption{Diagrama de Clases conceptuales para el sistema Pizza Hack}
\end{figure}

\clearpage

\subsection{Restricciones sobre modelo mediante OCL}
\begin{enumerate}
      \item \textsf{Debe haber una única sucursal con token en un momento dado:}
	    	\subitem \textbf{Context Sucursal}
	    	\subitem inv: Sucursal.allInstances() $\rightarrow$ select(s $\vert$ s.token = true ) $\rightarrow$ size() = 1
			\subitem %este subitem en blanco es para haya mayot espaciado entre las restricciones
	  %--------%
      \item \textsf{El número de cada sucrusal es único}
			\subitem \textbf{Context Sucursal}
	    	\subitem inv: Sucursal.allInstances() $\rightarrow$ forAll(s1, s2 $\vert$ s1 $<>$ s2 implies s1.numero $<>$ s2.numero) 
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
      %--------%
	  \item \textsf{Las variedades de las pizzas deben estar en el menú de la sucursal donde se pidan} %(Deberíamos fijarnos en el estado de los pedidos?) 
			\subitem \textbf{Context Sucursal}
			\subitem inv: self.pedidos.pizzasPedidas $\rightarrow$ forAll( p $\vert$ self.menu.VariedadPizzas $\rightarrow$ includes(p))
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
      %--------%
	  \item \textsf{El número de pedido es único para cada sucursal}
			\subitem \textbf{Context Sucursal}
			\subitem self.pedidos $\rightarrow$ forAll( p1, p2 $\vert$ p1 $<>$ p2 implies p1.numero $<>$ p2.numero)
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{La cantidad de sucursales sincronizadas es concistente}
			\subitem \textbf{Context Sincronizacion}
			\subitem self.cantidadSucursales $=$ self.sucursales $\rightarrow$ sum()
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{Debe haber suficientes ingredientes disponibles para poder atender los pedidos\\
	  (cantidad * ingredientesNecesarios $<=$ stock) en Cola de una misma sucursal}
			\subitem \textbf{Context Ingredientes}
			\subitem inv: self.Sucursal $\rightarrow$ forAll( s1 $\vert$ self.VariedadPizza $\rightarrow$ \\
			iterate(v1:VariedadPizza , acc = Bag{} $\vert$  acc $\rightarrow$ including(\emph{totalIngredientesPorVariedad})) $\rightarrow$ sum() \\ 
			$<=$ self.sucursal $\rightarrow$ select( s2 $\vert$ s2 = s1).Stock.disponible $\rightarrow$ sum()
			\subitem %este subitem en blanco es para haya mayot espaciado entre las restricciones
			\subitem \emph{totalIngredientesPorVariedad}: (context implicito Ingredientes) \\
			self.cantidadIngredientes $\rightarrow$ collect(c $\vert$ c.variedadPizza = v1).cantidad $\rightarrow$ sum() * \emph{cantidadPedidaPorVariedad}
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
			\subitem \emph{cantidadPedidaPorVariedad}: Pedido.allInstances() $\rightarrow$ \\ 
			collect(p: pedido $\vert$ p.sucursal = s1 and p.estado $<>$ Finalizado).CantidadPedida $\rightarrow$ \\
			collect(c: CantidadPedida $\vert$ c.VariedadPizza = v1 ).cantidad $\rightarrow$ sum()
			\subitem %este subitem en blanco es para haya mayot espaciado entre las restricciones
	  %--------%
	  \item \textsf{Debe haber un único menú(todas las variedades de pizzas deben estar en el mism menú)} %CONSULTAR
			\subitem \textbf{Context Menu}
			\subitem Menu.allInstances() $\rightarrow$ size() = 1 
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	   \item \textsf{Debe haber una única sincronización(todas las sucursales deben estar sincronizadas de igual manera)}
			\subitem \textbf{Context Sincronizacion}
			\subitem Sincronizacion.allInstances() $\rightarrow$ size() = 1 
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{No es posible derivar pedidos a la misma sucursal}
			\subitem \textbf{Context Pedido de otra sucursal}
			\subitem self.realizadoEn.nroSucursal $<>$ self.derivadoDesde.nroSucursal
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{No hay sucursales con cantidad de mesas negativas}
			\subitem \textbf{Context Sucursal}
			\subitem self.cantidadMesas $>=$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{El precio de cualquier variedad de pizza es no negativo}
			\subitem \textbf{Precio}
			\subitem self.precio $>$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{Un pedido es conformado por al menos una variedad de pizza}
			\subitem \textbf{CantidadPedida}
			\subitem self.cantidad $>=$ 1
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{La cantidad disponible de un ingrediente es no negativa}
			\subitem \textbf{Stock}
			\subitem self.cantidadDisponible $>=$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{El límite mínimo que posee un ingrediente es no negativa}
			\subitem \textbf{Stock}
			\subitem self.limiteMinimo $>=$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{La cantidad reservada de un ingrediente es no negativa}
			\subitem \textbf{Stock}
			\subitem self.cantidadReservada $>=$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
	  %--------%
	  \item \textsf{La cantidad a cargar de un ingrediente es no negativa}
			\subitem \textbf{Stock}
			\subitem self.cantidadComprada $>=$ 0
			\subitem %este subitem en blanco es para haya mayor espaciado entre las restricciones
\end{enumerate}

\clearpage

\subsection{Descripciones de las clases conceptuales}
A continuación presentaremos una breve descripción de las clases conceptuales elegidas en el modelo conceptual, como así también presentaremos que requerimientos de software cumple cada una.\\

\begin{enumerate}
  
   \item \textbf{\textsf{Clases Conceptuales:}}
	\begin{itemize}
        \item Sucursal: esta clase se corresponde con los locales o sucursales de la cadena. Posee los siguientes atributos:
			  \subitem número: \textbf{int} $\rightarrow$ número único para identificar el local (id).
			  \subitem token: \textbf{Boolean} $\rightarrow$ valor que indica si la sucursal posee el turno.
			  \subitem Se necesita para los Requerimientos: 1, 2, 3, 4, 6, 7, 8, 10, 11.
		
		\item Pedido: esta clase se corresponde con los pedidos realizados por los clientes. Un pedido puede estar compuesto por varias pizzas de distintas variedades.
			  \subitem estado: \textbf{eEstado} $\rightarrow$ estado en que se encuentra el pedido.
			  \subitem Se necesita para los Requerimientos: 1, 2, 3, 14, 19, 20, 22, 23, 24.
			
		\item Pedido de otra sucursal(hereda pedido): posee las mismas características que pedido y además registra en qué sucursal se realizó la reserva del mismo.
			  \subitem Se necesita para los Requerimientos: 4.
			
		\item Pedido de misma sucursal(hereda pedido): no posee ninguna información adicional. Sólo se sabe que es un pedido tomado en la misma sucursal donde se realizará/realizó.
			
		\item Menu: clase que se corresponde con el Menú. %Agrupa las variedades y los precios.
			  \subitem Se necesita para los Requerimientos: 5, 6, 7, 22.
			
		\item VariedadPizza: representa la variedad de pizza que se elabora en la cadena.
			  \subitem nombre: \textbf{string} $\rightarrow$ etiqueta para identificar la variedad de pizza.
			  \subitem Se necesita para los Requerimientos: 6, 7, 8, 19, 20.
			
		\item Ingredientes: se corresponde con el tipo de ingrediente y no con el ingrediente fijo. Por ej, el tipo cebolla, no se refiere a una unidad de la misma.
			  \subitem nombre: \textbf{string} $\rightarrow$ etiqueta para identificar el tipo de ingrediente.
			  \subitem Se necesita para los Requerimientos: 1, 2, 3, 6, 7, 8, 12, 13, 19, 20.
			
    \end{itemize}
	%-----------%
	\clearpage
	%-----------%
	\item \textbf{\textsf{Clases Asociativas:}}
	\begin{itemize}
		  \item Precio: Valor que tiene una variedad de pizza.
			  \subitem precio: \textbf{Real} $\rightarrow$ valor.
			  \subitem Se necesita para los Requerimientos: 6, 7, 8.
			  
		  \item CantidadPedida: cantidad de pizzas de una variedad que fueron ordenadas en el pedido.
			  \subitem cantidad: \textbf{int} $\rightarrow$ valor.
			  \subitem Se necesita para los Requerimientos: 19, 20.
			  
		  \item CantidadIngredientes: cantidad de ingredientes del tipo asociado que necesita la variedad de pizza para su elaboración.
			  \subitem cantidad: \textbf{int} $\rightarrow$ valor.
			  \subitem Se necesita para los Requerimientos: 6, 7, 8, 19, 20.
			  
		  \item Stock: registra la información necesaria para el control y manejo del stock del ingrediente por local.
			  \subitem cantidadDisponible: \textbf{int} $\rightarrow$ ingredientes disponibles para reservar.
			  \subitem cantidadReservada: \textbf{int} $\rightarrow$ ingredientes reservados para los pedidos en cola.
			  \subitem cantidadComprada: \textbf{int} $\rightarrow$ cantidad que será cargada a futuro. El Encargado de Depósito setea este valor para informar que la alerta de Stock bajo fue atendida.
			  \subitem límiteMínimo: \textbf{int} $\rightarrow$ cantidad mínima de stock necesaria para que no se lance la alerta. Una vez que el item se encuentre por debajo de este valor, la alerta de pedido de compra se ejecuta.
			  \subitem Se necesita para los Requerimientos: 1, 2, 3, 12, 13, 15, 16, 17, 18, 19, 20.
		\end{itemize}
    %---------%
	\item \textbf{\textsf{Clases de Enumearación:}}
	\begin{itemize}
		  \item eEstado: tipo enumerado cuyos valores posibles representa los estados de un Pedido.
			  \subitem Finalizado $\rightarrow$ el pedido fue elaborado exitosamente. Una vez concluida su elaboración, se setea este valor.
			  \subitem enReserva $\rightarrow$ el pedido fue reservado. El pedido tomará este estado cuando sea reservado por otra sucursal.
			  \subitem enElaboracion $\rightarrow$ el pedido fue tomado por el cocinero, para su próxima elaboración.
			  \subitem enCola $\rightarrow$ el pedido fue puesto en la cola de espera, para ser tomado por la cocina.
	\end{itemize}

    					

\end{enumerate}



